package com.flowable.controller;

import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.TaskService;
import org.flowable.task.api.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.text.SimpleDateFormat;
import java.util.*;

@Slf4j
@RestController
@RequestMapping("/leave/manager")
public class ManagerTaskController {

    @Autowired
    private TaskService taskService;

    // 日期格式化器
    private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    /**
     * 获取经理待审批的请假任务列表
     */
    @GetMapping("/tasks")
    public List<Map<String, Object>> getManagerTasks() {
        log.info("获取领导待审批的任务！");
        List<Map<String, Object>> result = new ArrayList<>();

        // 1. 查询当前登录经理的待审批任务（假设经理角色组为"manager"）
        // 实际项目中应替换为当前登录用户ID：taskService.createTaskQuery().assignee(currentUserId)
        List<Task> tasks = taskService.createTaskQuery()
                .taskCandidateGroup("manager") // 匹配manager角色组的任务
                .taskDefinitionKey("managerApproval") // 匹配领导审批节点（与BPMN中的id一致）
                .orderByTaskCreateTime().desc() // 按创建时间倒序排列
                .list();

        // 2. 处理每个任务，封装所需信息
        for (Task task : tasks) {
            log.info("任务：{}", task);
            Map<String, Object> taskMap = new HashMap<>();
            
            // 基本任务信息
            taskMap.put("taskId", task.getId());
            taskMap.put("taskName", task.getName());
            taskMap.put("assignee", task.getAssignee() != null ? task.getAssignee() : "未分配");
            taskMap.put("createTime", DATE_FORMAT.format(task.getCreateTime()));
            taskMap.put("processInstanceId", task.getProcessInstanceId());
            taskMap.put("processDefinitionId", task.getProcessDefinitionId());
            
            // 3. 获取流程变量（申请人、请假天数、原因等）
            Map<String, Object> variables = new HashMap<>();
            try {
                // 获取该任务所属流程实例的所有变量
                Map<String, Object> processVariables = taskService.getVariables(task.getId());
                
                // 提取前端需要的变量（根据实际业务变量名调整）
                variables.put("applicant", processVariables.getOrDefault("applicant", "未知"));
                variables.put("days", processVariables.getOrDefault("days", 0));
                variables.put("reason", processVariables.getOrDefault("reason", "无"));
                variables.put("startDate", processVariables.getOrDefault("startDate", ""));
                variables.put("endDate", processVariables.getOrDefault("endDate", ""));
            } catch (Exception e) {
                // 变量获取失败时的容错处理
                variables.put("applicant", "未知");
                variables.put("days", 0);
                variables.put("reason", "变量获取失败");
            }
            
            taskMap.put("variables", variables);
            result.add(taskMap);
        }

        return result;
    }
}
    